package com.example.demo.randomdemo;

import com.example.demo.ServerIps;

import java.util.ArrayList;
import java.util.List;

/* ━━━━━━佛祖保佑━━━━━━
 *                  ,;,,;
 *                ,;;'(    社
 *      __      ,;;' ' \   会
 *   /'  '\'~~'~' \ /'\.)  主
 * ,;(      )    /  |.     义
 *,;' \    /-.,,(   ) \    码
 *     ) /       ) / )|    农
 *     ||        ||  \)
 *     (_\       (_\
 * ━━━━━━永无BUG━━━━━━
 * @author ：zjq
 * @date ：2021/3/2 11:19
 * @description: TODO    权重随机算法
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 */
public class WeightRandom {


    /**
     * 这种实现方法在遇到权重之和特别大的时候就会比较消耗内存，因为需要对ip地址进行复制，
     * 权重之和越大那么上文中的ips就需要越多的内存
     */
    public static String getServer() {
        // 生成一个随机数作为list的下标值
        // 这个ips 会根据权重   WEIGHT_LIST  权重之和为50  这个ips 的size就是 50
        List<String> ips = new ArrayList<String>();
        for (String ip : ServerIps.WEIGHT_LIST.keySet()) {
            Integer weight = ServerIps.WEIGHT_LIST.get(ip);
            // 按权重进行复制
            for (int i = 0; i < weight; i++) {
                ips.add(ip);
            }
        }
        java.util.Random random = new java.util.Random();
        int randomPos = random.nextInt(ips.size());
        return ips.get(randomPos);
    }

    public static void main(String[] args) {
        // 连续调用10次
        for (int i = 0; i < 10; i++) {
            System.out.println(getServer());
        }
    }


}
